package com.linkit.utils;

import java.text.Collator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.json.JSONArray;
import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

import com.linkit.config.MediaType;
import com.linkit.config.Setting;
import com.linkit.main.MainActivity;
import com.linkit.model.Article;

/**
 * Lớp tiện ích, dùng để xử lý các chức năng chung cho dự án
 * 
 * @author lucnd
 * 
 */

public class Utils {

	private static MainActivity mContext = MainActivity.getInstance();

	/**
	 * Hàm này dùng để chuyển một chuỗi có dạng "123,456,789" thành một mảng số
	 * nguyên {123,456,789}
	 * 
	 * @param str
	 *            : Chuỗi cần chuyển dạng "123,456,789"
	 * @return: Mảng số nguyên
	 */
	public static int[] convertStringToIntArray(String str) {
		int[] result = null;

		if (str != null) {
			String[] strs = str.split(",");
			if (strs != null) {
				result = new int[strs.length];
				for (int i = 0; i < strs.length; i++) {
					result[i] = Integer.parseInt(strs[i]);
				}
			}
		}

		return result;
	}

	/**
	 * Hàm này chuyển đổi một mảng số nguyên dạng {123,456,789} thành một chuỗi
	 * dạng "123,456,789"
	 * 
	 * @param ints
	 * @return
	 */
	public static String convertIntArrayToString(int[] ints) {
		String result = "";

		if (ints != null) {
			for (int i = 0; i < ints.length; i++) {

				if (i != ints.length - 1) {
					result += String.valueOf(ints[i]) + ",";
				} else {
					result += String.valueOf(ints[i]);
				}
			}
		}

		return result;
	}

	/**
	 * Tạo lại kích thước cho ảnh đưa vào
	 * 
	 * @param imageID
	 * @param newHeight
	 * @param newWidth
	 * @return
	 */
	public static Drawable resizeImage(int imageID, int newHeight, int newWidth) {

		Bitmap bMap = BitmapFactory.decodeResource(mContext.getResources(),
				imageID);
		Drawable drawable = new BitmapDrawable(mContext.getResources(),
				getResizedBitmap(bMap, newHeight, newWidth));

		return drawable;
	}

	/**
	 * Tạo lại ảnh với kích thước đã cho
	 * 
	 * @param bm
	 * @param newHeight
	 * @param newWidth
	 * @return
	 */
	public static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

		int width = bm.getWidth();
		int height = bm.getHeight();

		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;

		// tạo matrix cho các thao tác
		Matrix matrix = new Matrix();

		// điều chỉnh kích thước
		matrix.postScale(scaleWidth, scaleHeight);

		// tạo ảnh mới
		Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
				matrix, false);

		return resizedBitmap;
	}

	/**
	 * Hàm này lấy chuỗi trong file String
	 * 
	 * @param resId
	 * @return
	 */
	public static String getString(int resId) {
		return mContext.getResources().getString(resId);
	}

	public static int getDimen(int resId) {
		return (int) mContext.getResources().getDimension(resId);
	}

	public static int getColor(int resId) {
		return (int) mContext.getResources().getColor(resId);
	}

	/**
	 * So sánh 2 chuỗi kiểu utf8
	 * 
	 * @param first
	 * @param seconds
	 * @return
	 */
	public static int compareStringUTF8(String first, String seconds) {
		Locale locale = Locale.getDefault();
		Collator collator = Collator.getInstance(locale);
		return collator.compare(first, seconds);
	}

	/**
	 * Chuyển đổi thời gian thành
	 * 
	 * @param startDate
	 * @return
	 */
	public static String formatTime(String dateStr) {
		String result = "";
		SimpleDateFormat siDateFormat = new SimpleDateFormat(
				Constants.PATTENT_DATE_FORMAT_SERVER, Locale.getDefault());
		Date date;
		try {
			date = siDateFormat.parse(dateStr);
			siDateFormat = new SimpleDateFormat(Constants.PATTENT_TIME_FORMAT,
					Locale.getDefault());
			result = siDateFormat.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * Chuyển đổi thời gian thành
	 * 
	 * @param startDate
	 * @return
	 */
	public static String formatTime(Date date) {
		String result = "";
		SimpleDateFormat siDateFormat = new SimpleDateFormat(
				Constants.PATTENT_DATE_FORMAT_SERVER, Locale.getDefault());
		result = siDateFormat.format(date);
		return result;
	}

	/**
	 * phân tích dữ liệu json thành danh sách đối tượng bài viết
	 * 
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public static ArrayList<Article> getNewsList(JSONArray jsonList)
			throws Exception {

		if (jsonList == null || jsonList.length() == 0)
			return null;

		ArrayList<Article> sArray = new ArrayList<Article>();
		Article article = null;
		int length = jsonList.length();
		for (int i = 0; i < length; i++) {
			article = new Article();
			JSONObject c = jsonList.getJSONObject(i);
			
			article.type = c.getInt("tp");
			article.title = c.getString("tit");
			article.avatar = Constants.MEDIA_URL + c.getString("at");
			
			if(article.type == MediaType.IMAGE.getId()){
				article.content = article.avatar;
			}else{
				article.content = c.getString("ac");
			}
			article.linkComments = c.getString("l");
			article.time = c.getLong("d");
			sArray.add(article);
		}

		return sArray;
	}

	/**
	 * phân tích 1 chuỗi cách nhau dấu "," thành mảng
	 * 
	 * @param idStr
	 * @return
	 */
	public static List<String> parseString(String idStr) {
		
		if(idStr.length() == 0) return null;
		
		return Arrays.asList(idStr.split(","));
	}
	/**
	 * kiểm tra lấy tất cả các config
	 * @param idStr
	 * @return
	 */
	
	public static boolean isSelectedAll(List<String> ids) {
		if(ids == null || ids.size() != 1) return false;
		return Setting.SETTING_ALL_ID.equals(ids.get(0));
	}
}
